#ifndef __WM_7816_H__
#define __WM_7816_H__

#define _7816	(_7816_TypeDef *)_7816_BASE

typedef struct
{
	uint32_t Freq;
	uint32_t Fd;
	uint32_t StopBits;
	uint32_t LSB_MSB;
	uint32_t T0_1;
	uint32_t WaitTime;
	GPIO_TypeDef *RST_Port;
	uint32_t RST_Pin;
	GPIO_TypeDef *PWR_Port;
	uint32_t PWR_Pin;
	GPIO_TypeDef *CLK_Port;
	uint32_t CLK_Pin;
	GPIO_TypeDef *IO_Port;
	uint32_t IO_Pin;
} _7816_InitTypeDef;

typedef struct
{
	_7816_TypeDef                 *Instance;        /*!< 7816 registers base address        */

	_7816_InitTypeDef             Init;             /*!< 7816 communication parameters      */

}_7816_HandleTypeDef;

#define _7816_STOPBITS_1                     0x00000000
#define _7816_STOPBITS_2                     ((uint32_t)_7816_LC_STOPBIT)

#define _7816_LSB                    		(0x00000000)
#define _7816_MSB                     		((uint32_t)_7816_LC_LMSB)

#define _7816_T0							(0x00000000)
#define _7816_T1							((uint32_t)_7816_LC_T0T1)

#define IS_7816_INSTANCE(__INSTANCE__) ((INSTANCE) == _7816)

#define IS_7816_STOPBITS(STOPBITS) (((STOPBITS) == _7816_STOPBITS_1) || \
                                    ((STOPBITS) == _7816_STOPBITS_2))
									
#define IS_7816_LSB_MSB(PARITY) (((PARITY) == _7816_LSB) || \
                                ((PARITY) == _7816_MSB))
								
#define IS_7816_T0_1(T)			(((T) == _7816_T0)	|| \
								 ((T) == _7816_T1))

#define _7816_RST_L(__HANDLE__)	HAL_GPIO_WritePin((__HANDLE__)->Init.RST_Port, (__HANDLE__)->Init.RST_Pin, GPIO_PIN_RESET)
#define _7816_RST_H(__HANDLE__)	HAL_GPIO_WritePin((__HANDLE__)->Init.RST_Port, (__HANDLE__)->Init.RST_Pin, GPIO_PIN_SET)
#define _7816_PWR_L(__HANDLE__)	do{	\
									if (((__HANDLE__)->Init.PWR_Port == GPIOA) || ((__HANDLE__)->Init.PWR_Port == GPIOB))	\
									{	\
										HAL_GPIO_WritePin((__HANDLE__)->Init.PWR_Port, (__HANDLE__)->Init.PWR_Pin, GPIO_PIN_RESET);	\
									}	\
								}while(0)

#define _7816_PWR_H(__HANDLE__)	do{	\
									if (((__HANDLE__)->Init.PWR_Port == GPIOA) || ((__HANDLE__)->Init.PWR_Port == GPIOB))	\
									{	\
										HAL_GPIO_WritePin((__HANDLE__)->Init.PWR_Port, (__HANDLE__)->Init.PWR_Pin, GPIO_PIN_SET);	\
									}	\
								}while(0)
									
#define _7816_CLK_L(__HANDLE__)	HAL_GPIO_WritePin((__HANDLE__)->Init.CLK_Port, (__HANDLE__)->Init.CLK_Pin, GPIO_PIN_RESET)
#define _7816_IO_L(__HANDLE__)	HAL_GPIO_WritePin((__HANDLE__)->Init.IO_Port, (__HANDLE__)->Init.IO_Pin, GPIO_PIN_RESET)

#define _7816_CLK_ENABLE(__INSTANCE__)	CLEAR_BIT((__INSTANCE__)->LC, _7816_LC_CLKCTL)
#define _7816_CLK_DISABLE(__INSTANCE__)	SET_BIT((__INSTANCE__)->LC, _7816_LC_CLKCTL)
#define _7816_MODE_EN(__INSTANCE__)		SET_BIT((__INSTANCE__)->LC, _7816_LC_MODE)

HAL_StatusTypeDef HAL_7816_Init(_7816_HandleTypeDef *h7816);
void HAL_7816_HotReset(_7816_HandleTypeDef *h7816);
void HAL_7816_ColReset(_7816_HandleTypeDef *h7816);
void HAL_7816_DeActive(_7816_HandleTypeDef *h7816);


#endif
